package biz

import (
	"time"

	"github.com/google/wire"
)

// ProviderSet is biz providers.
var ProviderSet = wire.NewSet(
	NewProductUsecase,
	NewSeckillProductUsecase,
	NewSeckillEventUsecase,
	NewSeckillOrderUsecase,
	NewCategoryUsecase,
	NewBrandUsecase,
	NewGreeterUsecase,
	NewUserUsecase,
	NewPointsUsecase,
)

// 商品表
// Product 表示商品信息
type Product struct {
	ID          int64     `gorm:"primaryKey;autoIncrement;comment:商品ID"`    // 商品ID
	Name        string    `gorm:"type:varchar(100);not null;comment:商品名称"`  // 商品名称
	CategoryID  int64     `gorm:"not null;comment:分类ID"`                    // 分类ID
	BrandID     int64     `gorm:"not null;comment:品牌ID"`                    // 品牌ID
	Price       float64   `gorm:"type:decimal(10,2);not null;comment:商品价格"` // 商品价格
	Stock       int       `gorm:"not null;comment:商品库存"`                    // 商品库存
	Description string    `gorm:"type:text;comment:商品描述"`                   // 商品描述
	CreatedAt   time.Time `gorm:"comment:创建时间"`                             // 创建时间
	UpdatedAt   time.Time `gorm:"comment:更新时间"`                             // 更新时间
}

// 秒杀商品表
// SeckillProduct 表示秒杀商品信息
type SeckillProduct struct {
	ID             int64     `gorm:"primaryKey;autoIncrement;comment:秒杀商品ID"`  // 秒杀商品ID
	ProductID      int64     `gorm:"not null;index;comment:商品ID"`              // 商品ID
	SeckillPrice   float64   `gorm:"type:decimal(10,2);not null;comment:秒杀价格"` // 秒杀价格
	SeckillStock   int       `gorm:"not null;comment:秒杀库存"`                    // 秒杀库存
	SeckillStart   time.Time `gorm:"not null;comment:秒杀开始时间"`                  // 秒杀开始时间
	SeckillEnd     time.Time `gorm:"not null;comment:秒杀结束时间"`                  // 秒杀结束时间
	SeckillEventID int64     `gorm:"not null;index;comment:秒杀活动ID"`            // 秒杀活动ID
	CreatedAt      time.Time `gorm:"comment:创建时间"`                             // 创建时间
	UpdatedAt      time.Time `gorm:"comment:更新时间"`                             // 更新时间
}

// 秒杀活动表
// SeckillEvent 表示秒杀活动信息
type SeckillEvent struct {
	ID        int64     `gorm:"primaryKey;autoIncrement;comment:活动ID"`   // 活动ID
	Name      string    `gorm:"type:varchar(100);not null;comment:活动名称"` // 活动名称
	StartTime time.Time `gorm:"not null;comment:活动开始时间"`                 // 活动开始时间
	EndTime   time.Time `gorm:"not null;comment:活动结束时间"`                 // 活动结束时间
	Status    int8      `gorm:"not null;comment:活动状态"`                   // 活动状态
	CreatedAt time.Time `gorm:"comment:创建时间"`                            // 创建时间
	UpdatedAt time.Time `gorm:"comment:更新时间"`                            // 更新时间
}

// 分类表
// Category 表示商品分类信息
type Category struct {
	ID   int64  `gorm:"primaryKey;autoIncrement;comment:分类ID"`  // 分类ID
	Name string `gorm:"type:varchar(50);not null;comment:分类名称"` // 分类名称
}

// 品牌表
// Brand 表示商品品牌信息
type Brand struct {
	ID   int64  `gorm:"primaryKey;autoIncrement;comment:品牌ID"`  // 品牌ID
	Name string `gorm:"type:varchar(50);not null;comment:品牌名称"` // 品牌名称
}

// SeckillOrder 表示秒杀订单信息
// 字段风格统一，与 proto/pb.go 保持一致
type SeckillOrder struct {
	ID               int64      `gorm:"primaryKey;autoIncrement;comment:订单ID"`              // 订单ID
	UserID           int64      `gorm:"not null;index;comment:用户ID"`                        // 用户ID
	SeckillProductID int64      `gorm:"not null;index;comment:秒杀商品ID"`                      // 秒杀商品ID
	ProductID        int64      `gorm:"not null;index;comment:商品ID"`                        // 商品ID
	SeckillPrice     float64    `gorm:"type:decimal(10,2);not null;comment:秒杀价格"`           // 秒杀价格
	Quantity         int        `gorm:"not null;comment:购买数量"`                              // 购买数量
	Status           string     `gorm:"type:varchar(20);not null;comment:订单状态"`             // 订单状态（如：待支付、已支付、已取消等）
	OrderNo          string     `gorm:"type:varchar(64);uniqueIndex;not null;comment:订单编号"` // 订单编号
	TotalPrice       float64    `gorm:"type:decimal(10,2);not null;comment:订单总价"`           // 订单总价
	CreatedAt        time.Time  `gorm:"autoCreateTime;comment:创建时间"`                        // 创建时间
	PaidAt           *time.Time `gorm:"default:null;comment:支付时间"`                          // 支付时间
}
